package wge

import(
	"fmt"
	"encoding/json"
	"reflect"
	"strings"
)

// 转化器，处理数据与go数据结构之间的相互转换

type Structer interface {
	/** 数据转化到结构体 */
	ToStruct(data string);
}

type Stringer interface {
	/** 结构体转化到数据 */
	ToString() string
}

func ToString(i interface{}) string {
	body, e := json.Marshal(i)
	if e == nil {
		return string(body)
	}

	logger.Println(e)
	return ""
}

// 默认的结构体解析器
type convert struct {
	i	interface{}
}

func (c *convert)ToString() string {
	body, e := json.Marshal(c.i)
	if e == nil {
		return string(body)
	}

	logger.Println(e)
	return ""
}

// 给结构创建默认解析器
func Convert(i interface{}) Stringer {
	return &convert{i}
}

// 把一个 Map[string]string 数据映射到一个所有成员都是string类型的结构体指针， i 必须为指针
func Map2struct(m map[string]string, i interface{}) {
	t := reflect.ValueOf(i)
	if t.Kind() != reflect.Ptr {
		fmt.Println("Map2struct's args must ptr")
		return
	}
	v := t.Elem()
	if v.Kind() != reflect.Struct {
		fmt.Println("Map2struct's args must struct ptr")
		return
	}
	
	for n:=0;n<v.NumField();n++ {
		name := strings.ToLower(v.Type().Field(n).Name)
		val, ok := m[name]
		if ok {
			v.Field(n).SetString(val)
		}
	}
}